package Principal;
import Implementacion.Juego;
import Interfaces.Ficha;
import Interfaces.IJuego;
import Interfaces.*;
import Implementacion.*;
import TDA.MatrizTDA;
import Implementaciones.Matriz;

public class Principal {

	/**
	 * @param args
	 * @throws Exception 
	 */
	
	public static void main(String[] args) throws Exception {
		
		int cantFichas = 12;
		
		/****************************************************************************/
		/**
		 * FICHA F:
		 * 8 Posiciones
		 */
		/****************************************************************************/
		
         Ficha f11 = new Ficha("F",3,3);  //F "Original"
         f11.setearValor(0,1, true);
         f11.setearValor(0,2, true);
         f11.setearValor(1,0, true);
         f11.setearValor(1,1, true);
         f11.setearValor(2,1, true);
         
         Ficha f12 = new Ficha("F",3,3); //F "Original acostada"
         f12.setearValor(1,0, true);
         f12.setearValor(1,1, true);
         f12.setearValor(0,1, true);
         f12.setearValor(1,2, true);
         f12.setearValor(2,2, true);
         
         Ficha f13 = new Ficha("F",3,3); //F "Rotada"
         f13.setearValor(0,1, true);
         f13.setearValor(1,1, true);
         f13.setearValor(2,1, true);
         f13.setearValor(2,0, true);
         f13.setearValor(1,2, true);
         
         Ficha f14 = new Ficha("F",3,3); //F "Rotada 2"
         f14.setearValor(0,1, true);
         f14.setearValor(1,0, true);
         f14.setearValor(1,1, true);
         f14.setearValor(1,2, true);
         f14.setearValor(2,2, true);

         Ficha f15 = new Ficha("F",3,3); //F "Espejada"
         f15.setearValor(0,0, true);
         f15.setearValor(0,1, true);
         f15.setearValor(1,1, true);
         f15.setearValor(1,2, true);
         f15.setearValor(2,1, true);
         
         Ficha f16 = new Ficha("F",3,3); //F "Espejada Acostada"
         f16.setearValor(1,0, true);
         f16.setearValor(1,1, true);
         f16.setearValor(1,2, true);
         f16.setearValor(0,2, true);
         f16.setearValor(2,1, true);
         
         Ficha f17 = new Ficha("F",3,3); //F "Espejada Rotada"
         f17.setearValor(0,1, true);
         f17.setearValor(1,1, true);
         f17.setearValor(2,1, true);
         f17.setearValor(1,0, true);
         f17.setearValor(2,2, true);
         
         Ficha f18 = new Ficha("F",3,3); // F "Espejada Rotada 2"
         f18.setearValor(1,0, true);
         f18.setearValor(1,1, true);
         f18.setearValor(1,2, true);
         f18.setearValor(0,1, true);
         f18.setearValor(2,0, true);

        /****************************************************************************/
 		/**
 		 * FICHA I:
 		 * 2 Posiciones
 		 */
 		/****************************************************************************/
         Ficha f21 = new Ficha("I",5,1);  //DONE
         f21.setearValor(0,0, true);
         f21.setearValor(1,0, true);
         f21.setearValor(2,0, true);
         f21.setearValor(3,0, true);
         f21.setearValor(4,0, true);
         
         Ficha f22 = new Ficha("I",1,5);  //DONE
         f22.setearValor(0,0, true);
         f22.setearValor(0,1, true);
         f22.setearValor(0,2, true);
         f22.setearValor(0,3, true);
         f22.setearValor(0,4, true);
         /****************************************************************************/
  		/**
  		 * FICHA L:
  		 * 8 Posiciones
  		 */
  		/****************************************************************************/
                  
         Ficha f31 = new Ficha("L",4,2);  //L "Original"
         f31.setearValor(0,0, true);
         f31.setearValor(1,0, true);
         f31.setearValor(2,0, true);
         f31.setearValor(3,0, true);
         f31.setearValor(3,1, true);
         
         Ficha f32 = new Ficha("L",4,2); //L "Espejada Espejada"
         f32.setearValor(0,1, true);
         f32.setearValor(1,1, true);
         f32.setearValor(2,1, true);
         f32.setearValor(3,1, true);
         f32.setearValor(3,0, true);
      
         Ficha f33 = new Ficha("L",4,2); //L "Original espejada hacia abajo"
         f33.setearValor(0,0, true);
         f33.setearValor(0,1, true);
         f33.setearValor(1,0, true);
         f33.setearValor(2,0, true);
         f33.setearValor(3,0, true);
         
         Ficha f34 = new Ficha("L",4,2); //L "Espejada, espejada hacia abajo"
         f34.setearValor(0,0, true);
         f34.setearValor(0,1, true);
         f34.setearValor(1,1, true);
         f34.setearValor(2,1, true);
         f34.setearValor(3,1, true);
         
         Ficha f35 = new Ficha("L",2,4); //L "Original Acostada"
         f35.setearValor(0,3, true);
         f35.setearValor(1,0, true);
         f35.setearValor(1,1, true);
         f35.setearValor(1,2, true);
         f35.setearValor(1,3, true);
         
         Ficha f36 = new Ficha("L",2,4); //L "Original Acostado espejada hacia arriba"
         f36.setearValor(0,0, true);
         f36.setearValor(0,1, true);
         f36.setearValor(0,2, true);
         f36.setearValor(0,3, true);
         f36.setearValor(1,2, true);
         
         Ficha f37 = new Ficha("L",2,4); //L "Espejada acostada"
         f37.setearValor(0,0, true);
         f37.setearValor(1,0, true);
         f37.setearValor(1,1, true);
         f37.setearValor(1,2, true);
         f37.setearValor(1,3, true);
         
         Ficha f38 = new Ficha("L",2,4); //L "Espejada acostada espejada hacia arriba"
         f38.setearValor(0,0, true);
         f38.setearValor(1,0, true);
         f38.setearValor(0,1, true);
         f38.setearValor(0,2, true);
         f38.setearValor(0,3, true);
         
         /****************************************************************************/
   		/**
   		 * FICHA N:
   		 * 8 Posiciones
   		 */
   		/****************************************************************************/
         Ficha f41 = new Ficha("N",4,2);  //N "Original"
         f41.setearValor(0,1, true);
         f41.setearValor(1,0, true);
         f41.setearValor(1,1, true);
         f41.setearValor(2,0, true);
         f41.setearValor(3,0, true);
         
         Ficha f42 = new Ficha("N",4,2); //N "Simetrica"
         f42.setearValor(0,0, true);
         f42.setearValor(1,0, true);
         f42.setearValor(1,1, true);
         f42.setearValor(2,1, true);
         f42.setearValor(3,1, true);
         
         Ficha f43 = new Ficha("N",4,2); //N "Original Simetrica hacia arriba"
         f43.setearValor(0,0, true);
         f43.setearValor(1,0, true);
         f43.setearValor(2,0, true);
         f43.setearValor(2,1, true);
         f43.setearValor(3,1, true);
         
         Ficha f44 = new Ficha("N",4,2); //N "Simetrica simetrica hacia abajo"
         f44.setearValor(0,1, true);
         f44.setearValor(1,1, true);
         f44.setearValor(2,0, true);
         f44.setearValor(2,1, true);
         f44.setearValor(3,0, true);
         
         Ficha f45 = new Ficha("N",2,4); //N "Original Rotada"
         f45.setearValor(0,0, true);
         f45.setearValor(0,1, true);
         f45.setearValor(0,2, true);
         f45.setearValor(1,2, true);
         f45.setearValor(1,3, true);
         
         Ficha f46 = new Ficha("N",2,4); //N "Simetrica rotada"
         f46.setearValor(1,0, true);
         f46.setearValor(1,1, true);
         f46.setearValor(0,1, true);
         f46.setearValor(0,2, true);
         f46.setearValor(0,3, true);
         
         Ficha f47 = new Ficha("N",2,4); //N Original rotada 3 veces
         f47.setearValor(0,0, true);
         f47.setearValor(0,1, true);
         f47.setearValor(1,1, true);
         f47.setearValor(1,2, true);
         f47.setearValor(1,3, true);
         
         Ficha f48 = new Ficha("N",2,4); //N Simetrica rotada 3 veces
         f48.setearValor(0,2, true);
         f48.setearValor(0,3, true);
         f48.setearValor(1,0, true);
         f48.setearValor(1,1, true);
         f48.setearValor(1,2, true);
        
         /****************************************************************************/
         /**
    	 * FICHA P:
    	 * 8 Posiciones
    	 */
    	/****************************************************************************/
         Ficha f53 = new Ficha("P",3,2); //P "Original Rotada 2"
         f53.setearValor(0,0, true);
         f53.setearValor(0,1, true);
         f53.setearValor(1,0, true);
         f53.setearValor(1,1, true);
         f53.setearValor(2,0, true);
         
         Ficha f51 = new Ficha("P",3,2);  //P "Original"
         f51.setearValor(0,1, true);
         f51.setearValor(1,0, true);
         f51.setearValor(1,1, true);
         f51.setearValor(2,0, true);
         f51.setearValor(2,1, true);
         
         Ficha f52 = new Ficha("P",2,3); //P "Oringinal Rotada 1"
         f52.setearValor(0,0, true);
         f52.setearValor(0,1, true);
         f52.setearValor(0,2, true);
         f52.setearValor(1,1, true);
         f52.setearValor(1,2, true);
         
      
         
         Ficha f54 = new Ficha("P",2,3); //P "Original Rotada 3"
         f54.setearValor(0,0, true);
         f54.setearValor(0,1, true);
         f54.setearValor(1,0, true);
         f54.setearValor(1,1, true);
         f54.setearValor(1,2, true);
         
         Ficha f55 = new Ficha("P",3,2); // P "Simetrica"
         f55.setearValor(0,0, true);
         f55.setearValor(1,0, true);
         f55.setearValor(1,1, true);
         f55.setearValor(2,0, true);
         f55.setearValor(2,1, true);
         
         Ficha f56 = new Ficha("P",2,3); // P "Simetrica Rotada 1"
         f56.setearValor(0,1, true);
         f56.setearValor(0,2, true);
         f56.setearValor(1,0, true);
         f56.setearValor(1,1, true);
         f56.setearValor(1,2, true);
         
         Ficha f57 = new Ficha("P",3,2); //P "Simetrica rotada 2"
         f57.setearValor(0,0, true);
         f57.setearValor(0,1, true);
         f57.setearValor(1,0, true);
         f57.setearValor(1,1, true);
         f57.setearValor(2,1, true);
         
         Ficha f58 = new Ficha("P",2,3); //P "Simetrica rotada 3"
         f58.setearValor(0,0, true);
         f58.setearValor(0,1, true);
         f58.setearValor(0,2, true);
         f58.setearValor(1,0, true);
         f58.setearValor(1,1, true);
         
         /****************************************************************************/
         /**
    	 * FICHA T:
    	 * 4 Posiciones
    	 */
    	/****************************************************************************/
         
         Ficha f61 = new Ficha("T",3,3);  //T Original
         f61.setearValor(0,0, true);
         f61.setearValor(0,1, true);
         f61.setearValor(0,2, true);
         f61.setearValor(1,1, true);
         f61.setearValor(2,1, true);
         
         Ficha f62 = new Ficha("T",3,3); //T Rotada 1
         f62.setearValor(0,0, true);
         f62.setearValor(1,0, true);
         f62.setearValor(2,0, true);
         f62.setearValor(1,1, true);
         f62.setearValor(1,2, true);
         
         Ficha f63 = new Ficha("T",3,3);  //T Rotada 2
         f63.setearValor(0,1, true);
         f63.setearValor(1,1, true);
         f63.setearValor(2,0, true);
         f63.setearValor(2,1, true);
         f63.setearValor(2,2, true);
         
         Ficha f64 = new Ficha("T",3,3); //T Rotada 3
         f64.setearValor(1,0, true);
         f64.setearValor(1,1, true);
         f64.setearValor(1,2, true);
         f64.setearValor(0,2, true);
         f64.setearValor(2,2, true);
         
         /****************************************************************************/
         /**
    	 * FICHA U:
    	 * 4 Posiciones
    	 */
    	/****************************************************************************/
         Ficha f71 = new Ficha("U",2,3);  //U Original
         f71.setearValor(0,0, true);
         f71.setearValor(0,2, true);
         f71.setearValor(1,0, true);
         f71.setearValor(1,1, true);
         f71.setearValor(1,2, true);
         
         Ficha f72 = new Ficha("U",3,2); //U Rotada 1
         f72.setearValor(0,0, true);
         f72.setearValor(0,1, true);
         f72.setearValor(1,0, true);
         f72.setearValor(2,0, true);
         f72.setearValor(2,1, true);
         
         Ficha f73 = new Ficha("U",2,3); //U Rotada 2
         f73.setearValor(0,0, true);
         f73.setearValor(0,1, true);
         f73.setearValor(0,2, true);
         f73.setearValor(1,0, true);
         f73.setearValor(1,2, true);
         
         Ficha f74 = new Ficha("U",3,2); //U Rotada 3
         f74.setearValor(0,0, true);
         f74.setearValor(0,1, true);
         f74.setearValor(1,1, true);
         f74.setearValor(2,0, true);
         f74.setearValor(2,1, true);
         
         /****************************************************************************/
         /**
    	 * FICHA V:
    	 * 4 Posiciones
    	 */
    	/****************************************************************************/
         Ficha f81 = new Ficha("V",3,3);  //V Original
         f81.setearValor(0,0, true);
         f81.setearValor(1,0, true);
         f81.setearValor(2,0, true);
         f81.setearValor(2,1, true);
         f81.setearValor(2,2, true);
         
         Ficha f82 = new Ficha("V",3,3); //V Rotacion 1
         f82.setearValor(0,2, true);
         f82.setearValor(1,2, true);
         f82.setearValor(2,0, true);
         f82.setearValor(2,1, true);
         f82.setearValor(2,2, true);
         
         Ficha f83 = new Ficha("V",3,3); //V Rotacion 2
         f83.setearValor(0,0, true);
         f83.setearValor(0,1, true);
         f83.setearValor(0,2, true);
         f83.setearValor(1,2, true);
         f83.setearValor(2,2, true);
         
         Ficha f84 = new Ficha("V",3,3); //V Rotacion 3
         f84.setearValor(0,0, true);
         f84.setearValor(0,1, true);
         f84.setearValor(0,2, true);
         f84.setearValor(1,0, true);
         f84.setearValor(2,0, true);
         
         /****************************************************************************/
         /**
    	 * FICHA W:
    	 * 4 Posiciones
    	 */
    	/****************************************************************************/
         Ficha f91 = new Ficha("W",3,3);  //W Original
         f91.setearValor(0,0, true);
         f91.setearValor(1,0, true);
         f91.setearValor(1,1, true);
         f91.setearValor(2,1, true);
         f91.setearValor(2,2, true);
         
         Ficha f92 = new Ficha("W",3,3); //W Rotada 1
         f92.setearValor(2,0, true);
         f92.setearValor(2,1, true);
         f92.setearValor(1,1, true);
         f92.setearValor(1,2, true);
         f92.setearValor(0,2, true);
         
         Ficha f93 = new Ficha("W",3,3);//W Rotada 2
         f93.setearValor(0,0, true);
         f93.setearValor(0,1, true);
         f93.setearValor(1,1, true);
         f93.setearValor(1,2, true);
         f93.setearValor(2,2, true);
         
         Ficha f94 = new Ficha("W",3,3);//W Rotada 3
         f94.setearValor(0,1, true);
         f94.setearValor(0,2, true);
         f94.setearValor(1,1, true);
         f94.setearValor(1,0, true);
         f94.setearValor(2,0, true);
         
         /****************************************************************************/
         /**
    	 * FICHA X:
    	 * 1 Posicion
    	 */
    	/****************************************************************************/
         Ficha f101 = new Ficha("X",3,3);  //DONE
         f101.setearValor(0,1, true);
         f101.setearValor(1,0, true);
         f101.setearValor(1,1, true);
         f101.setearValor(1,2, true);
         f101.setearValor(2,1, true);
         
         /****************************************************************************/
         /**
    	 * FICHA Y:
    	 * 8 Posiciones
    	 */
    	/****************************************************************************/
         Ficha f111 = new Ficha("Y",4,2);  //Y Original
         f111.setearValor(0,1, true);
         f111.setearValor(1,0, true);
         f111.setearValor(1,1, true);
         f111.setearValor(2,1, true);
         f111.setearValor(3,1, true);
         
         Ficha f112 = new Ficha("Y",2,4); //Y Original Rotada 1
         f112.setearValor(0,2, true);
         f112.setearValor(1,0, true);
         f112.setearValor(1,1, true);
         f112.setearValor(1,2, true);
         f112.setearValor(1,3, true);
         
         Ficha f113 = new Ficha("Y",4,2); //Y original Rotada 2
         f113.setearValor(0,0, true);
         f113.setearValor(1,0, true);
         f113.setearValor(2,0, true);
         f113.setearValor(2,1, true);
         f113.setearValor(3,0, true);
         
         Ficha f114 = new Ficha("Y",2,4); //Y original Rotada 3
         f114.setearValor(0,0, true);
         f114.setearValor(0,1, true);
         f114.setearValor(0,2, true);
         f114.setearValor(0,3, true);
         f114.setearValor(1,1, true);
         
         Ficha f115 = new Ficha("Y",4,2);//Y simetrica
         f115.setearValor(0,0, true);
         f115.setearValor(1,0, true);
         f115.setearValor(1,1, true);
         f115.setearValor(2,0, true);
         f115.setearValor(3,0, true);
         
         Ficha f116 = new Ficha("Y",2,4); //Y Simetrica rotada 1
         f116.setearValor(0,0, true);
         f116.setearValor(0,1, true);
         f116.setearValor(0,2, true);
         f116.setearValor(1,2, true);
         f116.setearValor(0,3, true);
         
         Ficha f117 = new Ficha("Y",4,2); //Y Simetrica rotada 2
         f117.setearValor(0,1, true);
         f117.setearValor(1,1, true);
         f117.setearValor(2,0, true);
         f117.setearValor(2,1, true);
         f117.setearValor(3,1, true);
         
         Ficha f118 = new Ficha("Y",2,4); //Y Simetrica rotada 3
         f118.setearValor(0,1, true);
         f118.setearValor(1,0, true);
         f118.setearValor(1,1, true);
         f118.setearValor(1,2, true);
         f118.setearValor(1,3, true);
         /****************************************************************************/
         /**
    	 * FICHA Z:
    	 * 4 Posiciones
    	 */
    	/****************************************************************************/
         
         Ficha f121 = new Ficha("Z",3,3);  //Z Original
         f121.setearValor(0,0, true);
         f121.setearValor(0,1, true);
         f121.setearValor(1,1, true);
         f121.setearValor(2,1, true);
         f121.setearValor(2,2, true);
         
         Ficha f122 = new Ficha("Z",3,3); //Z original rotada
         f122.setearValor(0,2, true);
         f122.setearValor(1,0, true);
         f122.setearValor(1,1, true);
         f122.setearValor(1,2, true);
         f122.setearValor(2,0, true);
         
         Ficha f123 = new Ficha("Z",3,3); //Z simetrica
         f123.setearValor(0,1, true);
         f123.setearValor(0,2, true);
         f123.setearValor(1,1, true);
         f123.setearValor(2,0, true);
         f123.setearValor(2,1, true);
         
         Ficha f124 = new Ficha("Z",3,3); //Z simetrica rotada
         f124.setearValor(0,0, true);
         f124.setearValor(1,0, true);
         f124.setearValor(1,1, true);
         f124.setearValor(1,2, true);
         f124.setearValor(2,2, true);
      
         /**
          * Setear Filas de la Matriz de Fichas:
          * ARMO UNA MATRIZ CON TODAS LAS FICHAS POR FILA.
          * LA MATRIZ ES CUADRADA YA QUE ASI LO DEFINE EL TDA MATRIZ.
          */
                 
         MatrizTDA<Ficha> fichas = new Matriz<Ficha>();
         fichas.inicializarMatriz(cantFichas);          
         
         
         fichas.setearValor(0, 0, f21);  //CARGO LAS FICHAS I EN LA FILA 2
         fichas.setearValor(0, 1, f22);
         
         fichas.setearValor(1, 0, f61);  //CARGO LAS FICHAS T EN LA FILA 6
         fichas.setearValor(1, 1, f62);
         fichas.setearValor(1, 2, f63);
         fichas.setearValor(1, 3, f64);
         
         fichas.setearValor(2, 0, f53); //cambio la que tiene que ir la pongo primera
         fichas.setearValor(2, 2, f51);  //CARGO LAS FICHAS P EN LA FILA 5
         fichas.setearValor(2, 1, f52);
         fichas.setearValor(2, 3, f54);
         fichas.setearValor(2, 4, f55);
         fichas.setearValor(2, 5, f56);
         fichas.setearValor(2, 6, f57);
         fichas.setearValor(2, 7, f58);
         
         fichas.setearValor(3, 0, f101);  //CARGO LAS FICHAS X EN LA FILA 10
         
         fichas.setearValor(4, 0, f91);  //CARGO LAS FICHAS W EN LA FILA 9
         fichas.setearValor(4, 1, f92);
         fichas.setearValor(4, 2, f93);
         fichas.setearValor(4, 3, f94);
         
         fichas.setearValor(5, 0, f111);  //CARGO LAS FICHAS Y EN LA FILA 11
         fichas.setearValor(5, 1, f112);
         fichas.setearValor(5, 2, f113);
         fichas.setearValor(5, 3, f114);
         fichas.setearValor(5, 4, f115);
         fichas.setearValor(5, 5, f116);
         fichas.setearValor(5, 6, f117);
         fichas.setearValor(5, 7, f118);
         
         fichas.setearValor(6, 0, f11);  //CARGO LAS FICHAS F EN LA FILA 1
         fichas.setearValor(6, 1, f12);
         fichas.setearValor(6, 2, f13);
         fichas.setearValor(6, 3, f14);
         fichas.setearValor(6, 4, f15);
         fichas.setearValor(6, 5, f16);
         fichas.setearValor(6, 6, f17);
         fichas.setearValor(6, 7, f18);
                 
         fichas.setearValor(7, 0, f31);  //CARGO LAS FICHAS L EN LA FILA 3
         fichas.setearValor(7, 1, f32);
         fichas.setearValor(7, 2, f33);
         fichas.setearValor(7, 3, f34);
         fichas.setearValor(7, 4, f35);
         fichas.setearValor(7, 5, f36);
         fichas.setearValor(7, 6, f37);
         fichas.setearValor(7, 7, f38);
         
         fichas.setearValor(8, 0, f41);  //CARGO LAS FICHAS N EN LA FILA 4
         fichas.setearValor(8, 1, f42);
         fichas.setearValor(8, 2, f43);
         fichas.setearValor(8, 3, f44);
         fichas.setearValor(8, 4, f45);
         fichas.setearValor(8, 5, f46);
         fichas.setearValor(8, 6, f47);
         fichas.setearValor(8, 7, f48);
                        
         fichas.setearValor(9, 0, f71);  //CARGO LAS FICHAS U EN LA FILA 7
         fichas.setearValor(9, 1, f72);
         fichas.setearValor(9, 2, f73);
         fichas.setearValor(9, 3, f74);
         
         fichas.setearValor(10, 0, f81);  //CARGO LAS FICHAS V EN LA FILA 8
         fichas.setearValor(10, 1, f82);
         fichas.setearValor(10, 2, f83);
         fichas.setearValor(10, 3, f84);
                  
         fichas.setearValor(11, 0, f121);  //CARGO LAS FICHAS Z EN LA FILA 12
         fichas.setearValor(11, 1, f122);
         fichas.setearValor(11, 2, f123);
         fichas.setearValor(11, 3, f124);
         
         
         IJuego juego = new Juego();
         
         boolean resultado = juego.Rompecabeza2D(fichas);
         
         if (resultado){
        	 System.out.println("Se pudo armar rompecabezas");
        	 
         }else{
         	 System.out.println("No Se pudo armar rompecabezas");
         }
         
	}

}
